package cn.xzc.job.type;

import cn.xzc.job.TimerContext;

import java.time.Clock;
import java.util.Date;

/**
 * TimerContext接口的一个简单实现类【当前执行任务相关的时间信息】
 *
 * @author xzc
 * 当前时间 2024-02-12 21:30:00
 */
public class SimpleTimerContext implements TimerContext {

    private final Clock clock;

    
    private volatile Date lastScheduledExecutionTime;

    
    private volatile Date lastActualExecutionTime;

    
    private volatile Date lastCompletionTime;


    /**
     * Create a SimpleTimerContext with all time values set to {@code null}, exposing the system clock for the default time zone.
     * 使用默认构造器，其中的clock使用默认的系统clock
     */
    public SimpleTimerContext() {
        this.clock = Clock.systemDefaultZone();
    }

    /**
     * Create a SimpleTimerContext with the given time values, exposing the system clock for the default time zone.
     * 当前构造器，使用默认的系统clock，并手动设置当前定时任务上一次计划开始执行时间、上次实际开始执行时间、上一次实际完成实际
     *
     * @param lastScheduledExecutionTime last <i>scheduled</i> execution time 最后一次计划开始执行时间
     * @param lastActualExecutionTime    last <i>actual</i> execution time 最后一次实际开始执行时间
     * @param lastCompletionTime         last completion time 最后一次实际完成时间
     */
    public SimpleTimerContext(Date lastScheduledExecutionTime, Date lastActualExecutionTime, Date lastCompletionTime) {
        this();
        this.lastScheduledExecutionTime = lastScheduledExecutionTime;
        this.lastActualExecutionTime = lastActualExecutionTime;
        this.lastCompletionTime = lastCompletionTime;
    }

    /**
     * Create a SimpleTimerContext with all time values set to {@code null}, exposing the given clock.
     * 构造器，手动设置当前定时任务的clock
     *
     * @param clock the clock to use for trigger calculation 定时任务的clock/触发器计算时间使用
     */
    public SimpleTimerContext(Clock clock) {
        this.clock = clock;
    }


    /**
     * Update this holder's state with the latest time values.
     * 更新当前定时任务的上一次计划开始执行时间、上次实际开始执行时间、上一次实际完成实际
     *
     * @param lastScheduledExecutionTime last <i>scheduled</i> execution time 最后一次计划开始执行时间
     * @param lastActualExecutionTime    last <i>actual</i> execution time 最后一次实际开始执行时间
     * @param lastCompletionTime         last completion time   最后一次实际完成时间
     */
    public void update(Date lastScheduledExecutionTime, Date lastActualExecutionTime, Date lastCompletionTime) {
        this.lastScheduledExecutionTime = lastScheduledExecutionTime;
        this.lastActualExecutionTime = lastActualExecutionTime;
        this.lastCompletionTime = lastCompletionTime;
    }


    @Override
    public Clock getClock() {
        return this.clock;
    }

    @Override
    
    public Date lastScheduledExecutionTime() {
        return this.lastScheduledExecutionTime;
    }

    @Override
    
    public Date lastActualExecutionTime() {
        return this.lastActualExecutionTime;
    }

    @Override
    
    public Date lastCompletionTime() {
        return this.lastCompletionTime;
    }

}
